<?php
/**
* 名称：用户模型。
* 描述：提供"用户概念"的"程序逻辑"封装和"模型定义数据"。
*/
final class Model_Account{
    /**
    * 描述：加密公钥。
    */
    const SAFEKEY='FE1F5FAJHKGIC3-6740JKGHJK-BBJKA0-DHJKGHJKEE1-2AEA9D05DFC02';

    /**
    * 描述：用户cookie名称，统一进行cookie资源调用和管理。
    */
    const COOKIE_PATH='/';
    const COOKIE_DOMAIN=NULL;
    const COOKIE_EXPIRE=2592000; //记住密码，30天的时间。
    const COOKIE_USERNAME='admin_x4_username_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';
    const COOKIE_PASSWORD='admin_x4_password_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';
    const COOKIE_SYSTEM='admin_x4_license_1EA4B87D-AFD6-89D8-FDBC-8AFA7E184402';

    /**
    * 描述：验证给出的用户信息与数据库信息是否一致，来确定是不是正确的用户。
    * @param  string  $username optional 用户名。
    * @param  string  $password optional hash后的密码。
    * @return boolean
    */
    private static function Is($username=NULL,$password=NULL){
        #获取当前用户登录信息。
        list($username,$password)=array($username,$password);
        #检测是否为空，为空则则返回FALSE。
        if(empty($username)||empty($password)){
            return FALSE;
        }
        #验证信息是否与数据库信息一致。
        $data=Database::GetRowByValue('TryPHP_Admin_Account','Username',$username);
        if(empty($data)||$data['Password']!=$password){
            return FALSE;
        }
        return TRUE;
    }

    /**
    * 描述：检测当前用户是不是己经登录，检测给出的用户是不是有登录的权限。
    * @return boolean
    */
    public static function IsLogin(){
        return self::Is(Cookie::Get(self::COOKIE_USERNAME),Cookie::Get(self::COOKIE_PASSWORD));
    }

    /**
    * 描述：检测给出的用户数据是不是正确的用户。
    * @param  string  $username require 用户名。
    * @param  string  $password require hash后的密码。
    * @return boolean
    */
    public static function IsRightUser($username,$password){
        return self::Is($username,$password);
    }

    /**
    * 描述：根据获取到的信息，登录到系统。
    * @param  string  $username   require 用户名。
    * @param  string  $password   require hash后的密码。
    * @param  string  $isRemember require 是否记住密码。
    * @return boolean
    */
    public static function Login($username,$password,$system=NULL,$isRemember=NULL){
        #记录登录信息
        $cookieExpire=NULL;
        if($isRemember){
            $cookieExpire=time()+self::COOKIE_EXPIRE;
        }
        Database::ExecParameterized('update TryPHP_Admin_Account set LoginDatetime=?,LoginCount=LoginCount+1 where Username=?',array(
            date('Y-m-d G:i:s'),
            $username
        ));
        #写入登录cookie
        Cookie::Set(self::COOKIE_USERNAME,$username,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_PASSWORD,$password,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Set(self::COOKIE_SYSTEM,$system,$cookieExpire,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        return TRUE;
    }

    /**
    * 描述：登出、注销、退出系统，删除cookie信息。
    * @return void
    */
    public static function Logout(){
        Cookie::Delete(self::COOKIE_USERNAME,self::COOKIE_PATH,self::COOKIE_DOMAIN);
        Cookie::Delete(self::COOKIE_PASSWORD,self::COOKIE_PATH,self::COOKIE_DOMAIN);
    }

    /**
    * 描述：使用加蜜算法混淆用户相关的信息，如密码等。
    * @param  string $string require 要加密的字符串。
    * @return string
    */
    public static function Hash($string){
        return strtoupper(md5($string.self::SAFEKEY));
    }
}
?>